Component({
  properties: {
    // 最大上传数量
    limit: {
      type: Number,
      value: 5
    },
    // 文件大小限制(MB)
    fileSize: {
      type: Number,
      value: 5
    },
    // 允许的文件类型
    fileType: {
      type: Array,
      value: ["png", "jpg", "jpeg"]
    },
    // 是否显示提示
    showTip: {
      type: Boolean,
      value: true
    },
    // 是否禁用
    disabled: {
      type: Boolean,
      value: false
    },
    // 初始文件列表
    value: {
      type: Array,
      value: []
    },
    // 上传地址
    action: {
      type: String,
      value: "/common/upload"
    }
  },

  data: {
    fileList: [],
    dialogVisible: false,
    dialogImageUrl: ""
  },

  observers: {
    value(val) {
      this.setData({
        fileList: val.map(url => ({ url }))
      });
    }
  },

  methods: {
    // 文件读取完成
    onAfterRead(event) {
      const { file } = event.detail;
      const fileList = [...this.data.fileList];
      
      // 验证文件
      if (!this.validateFile(file)) {
        return;
      }
      
      // 显示加载
      wx.showLoading({ title: '上传中...', mask: true });
      
      // 添加到列表（临时状态）
      fileList.push({
        ...file,
        status: 'uploading',
        message: '上传中...'
      });
      
      this.setData({ fileList });
      
      // 上传到服务器
      this.uploadFile(file.path).then(res => {
        // 更新文件状态
        const index = fileList.findIndex(f => f.path === file.path);
        if (index !== -1) {
          fileList[index] = {
            ...file,
            url: res.url,
            status: 'done'
          };
          
          this.setData({ fileList });
          this.triggerEvent('change', this.getUrls());
        }
        
        wx.hideLoading();
      }).catch(err => {
        // 更新错误状态
        const index = fileList.findIndex(f => f.path === file.path);
        if (index !== -1) {
          fileList[index] = {
            ...file,
            status: 'failed',
            message: '上传失败'
          };
          
          this.setData({ fileList });
        }
        
        wx.hideLoading();
        wx.showToast({
          title: '上传失败',
          icon: 'none'
        });
      });
    },

    // 验证文件
    validateFile(file) {
      const { fileType, fileSize } = this.data;
      
      // 验证文件类型
      const extension = file.path.split('.').pop().toLowerCase();
      if (!fileType.includes(extension)) {
        wx.showToast({
          title: `请上传 ${fileType.join('/')} 格式文件`,
          icon: 'none'
        });
        return false;
      }
      
      // 验证文件大小 (单位: MB)
      const maxSize = fileSize * 1024 * 1024;
      if (file.size > maxSize) {
        wx.showToast({
          title: `文件大小不能超过 ${fileSize}MB`,
          icon: 'none'
        });
        return false;
      }
      
      return true;
    },

    // 上传文件到服务器
    uploadFile(filePath) {
      const { action } = this.data;
      const app = getApp();
      const baseUrl = app.globalData.baseUrl || '';
      const fullUrl = baseUrl + action;
      
      return new Promise((resolve, reject) => {
        wx.uploadFile({
          url: fullUrl,
          filePath: filePath,
          name: 'file',
          header: {
            'Authorization': `Bearer ${wx.getStorageSync('token')}`
          },
          success: (res) => {
            try {
              const data = JSON.parse(res.data);
              if (data.code === 200) {
                resolve({ url: data.data.url });
              } else {
                reject(data.msg || '上传失败');
              }
            } catch (e) {
              reject('解析响应失败');
            }
          },
          fail: (err) => {
            reject('上传失败');
          }
        });
      });
    },

    // 删除文件
    onDelete(event) {
      const { index } = event.detail;
      const fileList = [...this.data.fileList];
      fileList.splice(index, 1);
      
      this.setData({ fileList });
      this.triggerEvent('change', this.getUrls());
    },

    // 预览图片
    onPreview(event) {
      const { index } = event.detail;
      const { fileList } = this.data;
      
      this.setData({
        dialogVisible: true,
        dialogImageUrl: fileList[index].url
      });
    },

    // 关闭预览
    onCloseDialog() {
      this.setData({ dialogVisible: false });
    },

    // 获取URL列表
    getUrls() {
      return this.data.fileList.map(file => file.url);
    }
  }
});